package logger

import (
	"fmt"
	"os"
	"path/filepath"
	"sync/atomic"
	"text/template"
	"unsafe"
)

// LogFileConfig 表示日志文件的配置。
type LogFileConfig struct {
	LogFileName        string   // 日志文件名字
	LogFilePath        string   // 日志文件路径
	LogFileLevel       logLevel // 日志文件等级
	LogFileMaxLine     int      // 单个日志文件最大行数
	LogFileMaxNumber   int      // 日志文件最大编号(如果为0则不会每个生成间隔内只会产生一个带日期后缀的日志文件,日志文件达到最大行数则不会再写日志)
	LogFileMaxSaveDays int      // 日志文件最大保存天数(<1:永久保存 >=1:第二天0点删除 ... 以此类推)
	Keys               []string // Debug时可以输入的Key

	AppendFileInfo bool // 是否增加文件信息
	TrimFilePath   bool // 是否去除文件的路径
}

// GetAtomicFileLevel 获取日志文件的原子等级。
// 返回值:
//
//	logLevel: 当前日志等级。
func (cfg *LogFileConfig) GetAtomicFileLevel() logLevel {
	val := atomic.LoadInt64((*int64)(unsafe.Pointer(&logGlobal.config.LogFileLevel)))
	return logLevel(val)
}

var defaultLogConfig = &LogFileConfig{
	LogFileName:        "default",
	LogFilePath:        "./log/",
	LogFileLevel:       LogLevelDebug,
	LogFileMaxLine:     200000,
	LogFileMaxNumber:   2000,
	LogFileMaxSaveDays: 3,
	Keys:               []string{LogKey_Default},
	AppendFileInfo:     true,
	TrimFilePath:       true,
}

// GenLogConfigFile 生成默认的日志配置文件。
// 参数:
//
//	cfgpath: 配置文件路径。
func GenLogConfigFile(cfgpath string) {
	if filepath.Ext(cfgpath) == ".toml" {
		if _, err := os.Stat(cfgpath); os.IsNotExist(err) {
			tpl, err := template.New("LogFile").Parse(logfile)
			if err != nil {
				fmt.Println(err)
				return
			}
			key := &struct {
				MapList map[LogKeyEnum]string
			}{
				MapList: _LogKeyMap,
			}
			f, _ := os.Create(cfgpath)
			_ = tpl.Execute(f, key)
			f.Close()
			// 没有对应的log.toml文件
			// toml.DecodeFile(cfgpath, defaultLogConfig)
		}
	}
}

const (
	logfile = `
# 文件保存路劲
LogFilePath = "../logs/"
# 0 致命等级(输出致命日志)一般是未知错误,发生了里发报警
# 1 错误等级(输出错误日志)一般是已知错误,发生了需要处理
# 2 警告等级一般是配置表有错,但不影响正常运行等
# 3 信息等级上线后正常需要看到的日志,报告状态等
# 4 调试等级上线后不需要看到的日志,调试用,可以使用Key来临时开关的日志
# 只会输入小于等于LogFileLevel设置值的等级日志
LogFileLevel = 4
# 单个日志文件最大行数
LogFileMaxLine = 200000
# 日志文件最大编号
# (如果为0则不会每个生成间隔内只会产生一个带日期后缀的日志文件,
# 日志文件达到最大行数则不会再写日志)
LogFileMaxNumber = 2000
# 日志文件最大保存天数(0:永久保存 1:第二天0点删除 ... 以此类推)
LogFileMaxSaveDays = 3
# 是否增加文件信息
AppendFileInfo = false
# 是否去除文件的路径
TrimFilePath = false
# 日志为调试等级（Debug）时，
# 下面标注的Key才会被输出
# 可以根据需要自己在上面加
Keys = [    
{{range $key, $value := .MapList}}  "{{$key}}", # {{$value}}
{{end}}]
`
)
